package com.example.docmanagement.entity;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;
import java.util.UUID;

/**
 * 文档实体类
 * 对应数据库表：documents
 */
@Entity
@Table(name = "documents")
@EntityListeners(AuditingEntityListener.class) // 启用审计功能（自动填充时间）
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Document {

    /**
     * 文档 ID（主键，自增）
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 文档标题
     */
    @Column(nullable = false, length = 255)
    private String title;

    /**
     * URL 友好标识（唯一）
     */
    @Column(unique = true, nullable = false, length = 255)
    private String slug;

    /**
     * 文档摘要
     */
    @Column(columnDefinition = "TEXT")
    private String summary;

    /**
     * Markdown 内容（直接存储）
     */
    @Column(columnDefinition = "TEXT")
    private String content;

    /**
     * 渲染后的 HTML 内容
     */
    @Column(name = "content_html", columnDefinition = "TEXT")
    private String contentHtml;

    /**
     * 文件路径（项目内相对路径）
     */
    @Column(name = "content_path", length = 500)
    private String contentPath;

    /**
     * 外部 URL（如 MinIO 对象存储地址）
     */
    @Column(name = "content_url", columnDefinition = "TEXT")
    private String contentUrl;

    /**
     * Base64 编码的内容
     */
    @Column(name = "content_base64", columnDefinition = "TEXT")
    private String contentBase64;

    /**
     * 内容来源类型（Phase 3 扩展）
     * direct: 直接存储在数据库, minio: MinIO 对象存储, url: 外部 URL, file: 文件系统, base64: Base64 编码
     */
    @Column(name = "content_type", length = 20)
    private String contentType = "direct";

    /**
     * 文件大小（字节）
     * 用于 minio/url 类型的文档
     */
    @Column(name = "file_size")
    private Long fileSize;

    /**
     * 导入模式（Phase 3 新增）
     * null: 直接编辑, reference: 引用模式, imported: 导入模式
     */
    @Column(name = "import_mode", length = 20)
    private String importMode;

    /**
     * 原始来源 URL（导入模式时记录）
     */
    @Column(name = "source_url", columnDefinition = "TEXT")
    private String sourceUrl;

    /**
     * 导入时间
     */
    @Column(name = "imported_at")
    private LocalDateTime importedAt;

    /**
     * 是否自动同步（用于 URL 文档）
     */
    @Column(name = "auto_sync")
    private Boolean autoSync = false;

    /**
     * 上次同步时间
     */
    @Column(name = "last_synced_at")
    private LocalDateTime lastSyncedAt;

    /**
     * 文档封面图片 ID（Phase 3 新增）
     * 关联到 file_metadata 表
     */
    @Column(name = "cover_image_id")
    private Long coverImageId;

    /**
     * 封面图片 URL（冗余字段，方便查询）
     */
    @Column(name = "cover_image_url", columnDefinition = "TEXT")
    private String coverImageUrl;

    /**
     * 分类 ID（外键）
     */
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "category_id")
    private Category category;

    /**
     * 标签数组
     */
    @Column(columnDefinition = "TEXT[]")
    private String[] tags;

    /**
     * 文档状态：draft, published, archived
     */
    @Column(length = 20)
    private String status = "draft";

    /**
     * 是否公开
     */
    @Column(name = "is_public")
    private Boolean isPublic = true;

    /**
     * 版本号
     */
    @Column
    private Integer version = 1;

    /**
     * 文档语言
     */
    @Column(length = 10)
    private String language = "zh-CN";

    /**
     * 作者 ID（UUID）
     */
    @Column(name = "author_id")
    private UUID authorId;

    /**
     * 作者名称
     */
    @Column(name = "author_name", length = 100)
    private String authorName = "Admin";

    /**
     * 浏览次数
     */
    @Column(name = "view_count")
    private Integer viewCount = 0;

    /**
     * 点赞次数
     */
    @Column(name = "like_count")
    private Integer likeCount = 0;

    /**
     * 发布时间
     */
    @Column(name = "published_at")
    private LocalDateTime publishedAt;

    /**
     * 创建时间（自动填充）
     */
    @CreatedDate
    @Column(name = "created_at", nullable = false, updatable = false)
    private LocalDateTime createdAt;

    /**
     * 更新时间（自动填充）
     */
    @LastModifiedDate
    @Column(name = "updated_at", nullable = false)
    private LocalDateTime updatedAt;

    /**
     * 持久化之前的回调
     * 自动设置发布时间
     */
    @PrePersist
    public void prePersist() {
        if (this.createdAt == null) {
            this.createdAt = LocalDateTime.now();
        }
        if (this.updatedAt == null) {
            this.updatedAt = LocalDateTime.now();
        }
        if ("published".equals(this.status) && this.publishedAt == null) {
            this.publishedAt = LocalDateTime.now();
        }
    }

    /**
     * 更新之前的回调
     * 自动更新发布时间
     */
    @PreUpdate
    public void preUpdate() {
        this.updatedAt = LocalDateTime.now();
        if ("published".equals(this.status) && this.publishedAt == null) {
            this.publishedAt = LocalDateTime.now();
        }
    }
}
